package kgame5.k3d.core.view3d {
import kgame5.k3d.core.camera.CameraBee;
import kgame5.k3d.core.camera.DebugCameraBee;
import kgame5.k3d.core.obj3d.node3d.Node3D;
import kgame5.k3d.core.obj3d.node3d.group3d.World3D;
import kgame5.k3d.core.render.RenderEngine;
import kgame5.k3d.util3d.Factory3D;
import kgame5.k3d.util3d.Shaker;
import kgame5.kgui.GP;

import flash.display.Sprite;
import flash.geom.Rectangle;

/**
 * @author kangkai
 * 一个需要注意的地方，一个mc只设置width,height是不行的，设置之后他也是0
 */
public class View3D{
	
	//这个数字如果太小，就会出现广角镜的效果，就是在屏幕边远的东西会被拉长扭曲。所以不要使用
	//光角镜，要使用比较真实的距离，900是人眼距离屏幕的距离
	public static const D:Number=900;//假设人眼睛距离投影平面是300象素
	
	public var renderer:RenderEngine;
	public var camera:CameraBee;
	public var world:World3D;
	
	private var 
		mc_view:Sprite,//整个东西，在左上角
			mc_input:Sprite,//监听屏幕鼠标用的
			mc_3d:Sprite;//容器,装各个图层用的
	
	//鼠标3D,用来从2d桌面映射到3d世界
	private var mouse3D:Mouse3D;
	
	public function View3D(width:int,height:int,bDebug:Boolean=false){
		//-视图
		mc_view=new Sprite();
		mc_view.scrollRect=new Rectangle(0,0,width,height);
		
		mc_3d=new Sprite();
		mc_view.addChild(mc_3d);
		mc_3d.x=width/2;
		mc_3d.y=height/2;
		
		//--
		renderer=new RenderEngine();
		world=new World3D();
		camera=new CameraBee();
		
		//-添加
		//GP.drawRect(mc_3d.graphics, 0xff0000, -width/2, -height/2, width, height);
		mc_3d.addChild(world.getDO());
		
		//-添加事件监听层
		//--摄像机
		mc_input=new Sprite();//这个即使设置了width和height,也是空的
		mc_view.addChild(mc_input);
		mc_input.alpha=0;
		GP.fillRect(this.mc_input.graphics, 0xff0000, 0, 0, mc_view.scrollRect.width, mc_view.scrollRect.height);
		
		
		mouse3D=new Mouse3D();
		
		//-如果是debug模式，则有摄像机和其他
		if(bDebug){
			initDebug();
		}
	}
	
	public function getDO():Sprite{
		return mc_view;
	}
	
	public function render():void{
		renderer.renderScene(world, camera);//渲染整个世界
		
		mouse3D.update(mc_3d.mouseX,mc_3d.mouseY,camera);//更新Mouse3D的值，只有数值脏的时候才做
	}
	
	//如果在debug模式下工作，则会有坐标系和debug摄像机
	private function initDebug():void{
		
		//边框线，表示现在处于debug模式
		GP.drawRect(this.mc_view.graphics, 0xffff00, 0, 0, mc_view.scrollRect.width-1, mc_view.scrollRect.height-1);
		GP.drawRect(this.mc_view.graphics, 0xffff00, 2, 2, mc_view.scrollRect.width-1-4, mc_view.scrollRect.height-1-4);
		
		camera=new DebugCameraBee(mc_input);
		camera.radius=64*13;
		camera.y=64*13;
		camera.pan=180;
		camera.target.fill(0,0,0);
		
		//--构造模型
		world.addChild(Factory3D.CreateAxis());
		var grid:Node3D=Factory3D.CreateGridMesh(10, 10, 16);
		grid.x=-5*16;
		grid.z=5*16;
		world.addChild(grid);
	}
	
	
}//end of class
}
